package main

// 泛型方法

type ordered interface {
	~int
}

type maxableSlice[T ordered] struct {
	elems []T
}

// 泛型方法， receiver 必须写上完整的类型名称+形参列表
func (sl *maxableSlice[T]) max() T {
	if len(sl.elems) == 0 {
		panic("slice is empty")
	}

	max := sl.elems[0]
	for _, v := range sl.elems[1:] {
		if v > max {
			max = v
		}
	}
	return max
}

// 泛型方法，不支持再定义泛型类型参数
// func (sl*maxableSlice[T]) M1[E any](e E) // 编译报错：method must have no type parameterssyntax

type foo[A comparable, B any] struct{}

func (foo[A, B]) M1() {} // ok

func (foo[_, _]) M2() {} // ok

// func (foo[]) M3() {} // 报错

func main() {

}
